/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import logica.util.ClassificateUtil;
import logica.util.ClusterUtil;
import logica.util.Perfil;
import modelo.DTO.DTODataMining;
import modelo.DTO.DTOPerfilUnicoAlumno;
import weka.core.Attribute;
import weka.core.FastVector;

/**
 * Es la clase que se encarga de todo lo relacionado con la losgica de data mining, apoyándose en las clases del paquete util
 *
 * @version 1.1
 * @author Ion B. Padilla
 */
public class LogicaDataMining {
    private ArrayList<DTODataMining> visitasAlumnos;
    private FastVector vectorAtributos;
    private ArrayList<ArrayList<DTODataMining>> listaElementos,listaElementosFiltrada;
    private ArrayList<Attribute> listaAtributos;
    private ClusterUtil clUtil;   
    private double etiquetasClusters[];


    /**
     * Constructor de LogicaDataMining
     * @param visitasAlumnos Lista de paginas vistas por los alumnos se útiliza como referencia para hacer la lista de alumnos
     * es decir, para que un alumno sea considerado en el proyecto de data mining, ha de haber hecho click en alguna página del curso
     */
   public LogicaDataMining(ArrayList<DTODataMining> visitasAlumnos) {
        this.visitasAlumnos = visitasAlumnos;
        listaElementos = new ArrayList<ArrayList<DTODataMining>>();      
        listaAtributos = new ArrayList<Attribute>();
        vectorAtributos=new FastVector();      
    }  

   /**
     * Metodo para añadir un elemento a nuestra lista de atributos
     * @param elements lista de elementos que consideraremos en nuestra instancia
     * @param nombre nombre de la lista y que se le dará al atributo
     */
   public void addElement(ArrayList<DTODataMining> elements, String nombre){
       Attribute atributo=new Attribute(nombre);
       listaElementos.add(elements);
       listaAtributos.add(atributo);
       vectorAtributos.addElement(atributo);
   }
    /**
     * Metodo para crear los clusters, antes de ejecutarlo hemos de haber creado las instancias correctamente, usando
     * addElement() por cada atributo
     */
   public double[] createCluster (int numeroCluster){
       //creamos la clase ClusterUtil
       clUtil= new ClusterUtil(visitasAlumnos,listaElementos,vectorAtributos,numeroCluster);

       //llamamos al metodo createCluster()
       etiquetasClusters=clUtil.createCluster();

       return etiquetasClusters;
   }
    /**
     * Metodo que se encargará de llamar al metodo classificate de la clase classificateUtil
     * @param alumnos lista de alumnos a clasificar
     */
    public List<DTOPerfilUnicoAlumno> clasificate(List<DTODataMining> alumnos,Perfil perfiles,double [] etiquetasClusters){
        // creamos el objeto ClassificateUtil
        ClassificateUtil classUtil;

        classUtil=new ClassificateUtil(clUtil.getInstancia(),etiquetasClusters,listaElementos,listaAtributos,clUtil.getEval(),perfiles);

        //llamamos al metodo classificate
        return classUtil.clasificate(alumnos);
    }
    /**
     * Metodo para clasificar un alumno
     * @param alumno El alumno a clasificar
     */
    DTOPerfilUnicoAlumno clasificateStudent(DTODataMining alumno,Perfil perfiles,double [] etiquetasClusters,List<DTODataMining> usuarios) {
        // creamos el objeto ClassificateUtil
        ClassificateUtil classUtil;

        classUtil=new ClassificateUtil(clUtil.getInstancia(),etiquetasClusters,listaElementos,listaAtributos,clUtil.getEval(),perfiles);

        //llamamos al metodo classificateStudent
        return classUtil.clasificateStudent(alumno,usuarios);
    }

}
